#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 命令常量
enum
{
    CMD_QUIT,   // 退出
    CMD_READ,   // 读取
    CMD_SAVE,   // 保存
    CMD_PRINT,  // 打印
    CMD_QUERY,  // 查询
    CMD_INSERT, // 添加
    CMD_UPDATE, // 修改
    CMD_DELETE, // 删除
    CMD_SORT,   // 排序
    CMD_CHART,  // 图表
};

// 函数声明
void init(void);         // 程序启动
void quit(void);         // 程序退出
void display_menu(void); // 显示命令菜单
int make_choice(void);   // 选择命令
int confirm(const char *msg);

void query_data(void);
void add_data(void);
void update_data(void);
void delete_data(void);
void read_data(void);
void save_data(void);
void print_data(void);
void sort_data(void);
void make_chart(void);


// 主程序
int main(void)
{
    init();
    for (;;)
    {
        display_menu();
        int c = make_choice();
        switch (c)
        {
        case CMD_READ:
            read_data();
            break;
        case CMD_SAVE:
            save_data();
            break;
        case CMD_PRINT:
            print_data();
            break;
        case CMD_QUERY:
            query_data();
            break;
        case CMD_INSERT:
            add_data();
            break;
        case CMD_UPDATE:
            update_data();
            break;
        case CMD_DELETE:
            delete_data();
            break;
        case CMD_SORT:
            sort_data();
            break;
        case CMD_CHART:
            make_chart();
            break;
        case CMD_QUIT:
            if (confirm("确定要退出吗？"))
                quit();
            break;
        default:
            printf("命令错误，请重新选择\n");
        }
    }
    return 0;
}

void init(void)
{
    puts("程序启动");
}

void quit(void)
{
    puts("程序退出");
    exit(EXIT_SUCCESS);
}

void display_menu(void)
{
    printf("\n%d 读取 | %d 保存 | %d 打印 | %d 查询 | %d 添加\n"
           "%d 修改 | %d 删除 | %d 排序 | %d 图表 | %d 退出\n\n",
           CMD_READ, CMD_SAVE, CMD_PRINT, CMD_QUERY, CMD_INSERT,
           CMD_UPDATE, CMD_DELETE, CMD_SORT, CMD_CHART, CMD_QUIT);
}

int make_choice(void)
{
    int choice;
    int ok = 0;

    while (!ok)
    {
        printf("请选择：");
        ok = scanf("%d", &choice);
        scanf("%*[^\n]");
    }

    return choice;
}

int confirm(const char *msg)
{
    char c = 'n';
    printf("%s(Y/N): ", msg);
    scanf(" %c%*[^\n]", &c);
    return c == 'y' || c == 'Y';
}

#define NAME_LEN 31
#define MAX_PARTS 100

// 保存图书信息的结构
struct part {
    int number;
    char name[NAME_LEN + 1];
    int on_hand;
};

static struct part inventory[MAX_PARTS]; // 结构体数组保存图书信息
static int num_parts = 0; // 当前图书数量

#define NOT_FOUND -1

int find(int num)
{
    for (int i = 0; i < num_parts; i++)
        if (inventory[i].number == num) return i;

    return NOT_FOUND;
}

void query_data(void)
{
    int num;
    int flag = 0;
    puts("输入图书编号:");
    scanf("%d", &num);

    if (find(num) == NOT_FOUND)
    {
        printf("没找到");
    }
    else
    {
        printf("图书编号：%d", inventory[flag].number);
        printf("图书名称：%s", inventory[flag].name);
        printf("图书库存：%d", inventory[flag].on_hand);
    }
    //puts("查询");
}

void add_data(void)
{

    int i = 0;

    puts("输入图书编号：");
    scanf("%d", &inventory[num_parts].number);
    while (1)
    {
        if (num_parts == 0)
            break;

        if (inventory[num_parts].number == inventory[i].number)
        {
            break;
        }

        i++;
    }
    if (i == num_parts - 1)
        printf("图书 %d 已添加", inventory[num_parts].number);
    else
    {
        puts("输入图书名字：");
        scanf("%s", &inventory[num_parts].name);

        puts("输入图书数量：");
        scanf("%d", &inventory[num_parts].on_hand);
        num_parts++;
    }
}

void update_data(void)
{
    printf("修改\n输入图书编号：");
    int a;
    scanf("%d", &a);
    for (int i = 0; i < num_parts; i++)
    {
        if (a == inventory[i].number)
        {
            printf("输入图书名称：");
            scanf("%s", inventory[i].name);
            printf("输入图书库存：");
            scanf("%d", &inventory[i].on_hand);
            printf("图书  %d  已更新", inventory[i].number);
            return;
        }
    }
    printf("图书不存在\n");
}
void delete_data(void)
{
    printf("删除\n输入图书编号：");
    int a;
    scanf("%d", &a);
    for (int i = 0; i < num_parts; i++)
    {
        if (a == inventory[i].number)
        {
            for (int j = i; j < num_parts; j++)
            {
                inventory[j].number = inventory[j + 1].number;
                inventory[j].on_hand = inventory[j + 1].on_hand;
                strcpy(inventory[j].name, inventory[j + 1].name);
            }
            printf("图书  %d  已删除", a);
            num_parts--;
            return;
        }
    }
    printf("图书不存在\n");
}

void read_data(void)
{
    puts("读取");
    printf("请输入文件名：");

    char filename[256];
    scanf("%s", filename);

    FILE *fp = fopen(filename, "r");
    if (fp == NULL)
    {
        perror(filename);
        return;
    }

    int i = 0;
    while(fscanf(fp, "%d,%[^,],%d", &inventory[i].number, inventory[i].name, &inventory[i].on_hand) == 3)
        i++;
    fclose(fp);

    num_parts = i;

    printf("读取 %d 记录\n", num_parts);
}
void save_data(void)
{
    puts("保存数据");
    printf("请输入文件名: ");

    char filename[256];
    scanf("%s",filename);

    FILE *fp = fopen(filename,"w");
    if ( fp == NULL ) {
        perror(filename);
        return;
    }

    for (int i = 0; i < num_parts; i++){
        fprintf(fp, "%d,%s,%d\n", inventory[i].number,inventory[i].name,inventory[i].on_hand);
    }
    fclose(fp);

    printf("保存 %d 记录\n", num_parts);
}
void print_data(void)
{
    printf("打印\n");
    printf("-------------------------------------------------------------------\n");
    printf("| NUMBER     |           NAME                        | ON HAND    |\n");
    printf("-------------------------------------------------------------------\n");
    for (int i = 0; i < num_parts; i++)
    {
        printf("|%12d|", inventory[i].number);
        int lon = strlen(inventory[i].name);
        printf("%s", inventory[i].name);
        for (int k = 0; k < 39 - lon; k++)
            printf(" ");
        printf("|%12d|\n", inventory[i].on_hand);
    }
    printf("-------------------------------------------------------------------\n\n\n\n");
}
void sort_data(void)
{
    printf("排序\n");
    for (int i = 0; i < num_parts; i++)
    {
        int min = i;
        for (int j = i + 1; j < num_parts; j++)
        {
            if (inventory[min].number > inventory[j].number)
                min = j;
        }
        int q;
        char tpp[32];
        q = inventory[i].number;
        inventory[i].number = inventory[min].number;
        inventory[min].number = q;
        q = inventory[i].on_hand;
        inventory[i].on_hand = inventory[min].on_hand;
        inventory[min].on_hand = q;
        strcpy(tpp, inventory[i].name);
        strcpy(inventory[i].name, inventory[min].name);
        strcpy(inventory[min].name, tpp);
    }
    printf("排序成功");
}

void make_chart(void)
{
    printf("图表\n");
    for (int i = 0; i < num_parts; i++)
    {
        printf("%10d：", inventory[i].number);
        int lon = strlen(inventory[i].name);
        printf("%s", inventory[i].name);
        for (int k = 0; k < 20 - lon; k++)
            printf(" ");
        printf("| ");
        for (int j = 0; j < inventory[i].on_hand; j++)
            printf(":");
        printf("(%d)\n", inventory[i].on_hand);
    }
}